home *** CD-ROM | disk | FTP | other *** search
- /*
- dshell v3
-
- DSHELLコントロール
- */
-
- #include "dsh.h"
-
- #define SSCRL FALSE
-
- static void On_Menubar1(int);
- static void On_Menubar2(int);
- static void On_Main_Screen(int, int);
- static void Fkey_Down_Check(int *, int *, uchar []);
- static void Ctrl_Down(int, int);
- static void line_b(void);
- static void line_f(void);
-
- void check_keysns(void);
-
- // v3.30
- enum {
- ONEKEY_CONT = 0,
- ONEKEY_EXEC = 1,
- ONEKEY_RETN = -1,
- };
- static uchar selectedFlag; // TRUE...'◎' が見つかった
- static uchar backwardFlag; // TRUE...後方検索/実行
- static int ontime; // 現在時刻 (起動時からの経過日時)
- static int etMenu; // 最下行メニューリピート用
- static int etTab; // TAB/XF3/XF4 リピート用
-
- static int keyEvent(int *, int *, ushort);
- static int oneKeyView(int, int, uchar);
- static int checkOneKeyView(void);
- static void locateTypeLine(int, int);
- static int isTypeLine(const uchar *);
- static void p_mark(int);
- static void callDtype(int);
- static void callDexec(const char *, int);
- static void adjMspos(void);
- static void inOutDebugMode(void);
- void locateEol(int);
-
- // v3.33a
- static int checkRapidExec(void);
-
-
- /*
- DSHELL コントロール
-
- (global)nest: 階層
- (global)lhp: テキスト行ポインタテーブルへのポインタ
- (global)lp: 表示開始行
- (global)lpmx: 最大行数
- */
- static int dmx, dmy, bl, br;
- static char obl, obr;
-
- int
- get_event(void)
- {
- static uchar *markedText = NULL; // == lhp[0] なら先頭/末尾で自動実行停止
- static ushort shiftKeys;
- int x, y;
-
- /* lp = 0; ; lp はget_event()呼出前に初期化済のこと */
-
- bl = br = 0;
- etMenu = etTab = 0;
- selectedFlag = FALSE;
- curLine = 0;
- exeLine = -1;
- if (lp1st >= 0) {
- lp = lp1st;
- lp1st = -1;
- if (lp >= lpmx) {
- lp = lpmx - 30;
- if (lp < 0)
- lp = 0;
- }
- }
- curLine = lp;
-
- if (checkRapidExec())
- return 0;
-
- p_fukki();
- p_scr();
- p_fpt(1);
- wait_mb_off();
- clr_kbf();
- mouse(1);
-
- while (1) {
- ontime = d_ontime();
- shiftKeys = B_SFTSNS();
- check_keysns();
-
- p_time(0);
- obl = bl;
- obr = br;
- dmspos(&x, &y);
- dmsstat(&dmx, &dmy, &bl, &br);
-
- /*
- スペースによる1キー閲覧
- コード入力キーによる自動実行
- */
- if (checkOneKeyView()) {
- ushort stepFlag = FALSE;
-
- backwardFlag = (shiftKeys & SHIFT_KEY);
- if (debugMode) {
- if (shiftKeys & LED_CODEIN) {
- backwardFlag = !!(shiftKeys & LED_ZENKAKU);
- if (shiftKeys & LED_INS) {
- w_wait(20);
- w_wait(20);
- }
- } else {
- if (shiftKeys & LED_ZENKAKU)
- backwardFlag ^= SHIFT_KEY;
- stepFlag = ((shiftKeys & (OPT1_KEY | OPT2_KEY | SHIFT_KEY)) == OPT1_KEY);
- if ((shiftKeys & (OPT1_KEY | OPT2_KEY | SHIFT_KEY)) == OPT2_KEY) {
- markedText = lhp[0];
- LEDMOD(2, 1);
- } else
- markedText = NULL;
- }
- }
- switch (oneKeyView(x, y, TRUE)) {
- case ONEKEY_CONT:
- break;
- case ONEKEY_EXEC:
- if (stepFlag)
- LEDMOD(2, 1);
- mspos(&x, &y);
- if (x < 16 && y >= 1*16 && y < 31*16)
- setmspos(16, y);
- lp1st = (backwardFlag) ? INT_MAX : 0;
- callDtype(curLine);
- lp1st = -1;
- setmspos(x, y);
- if (stepFlag)
- LEDMOD(2, 0);
- oneKeyView(x, y, FALSE);
- break;
- case ONEKEY_RETN:
- if (debugMode && (shiftKeys & LED_CODEIN)
- && (!nest || lhp[0] == markedText)) {
- LEDMOD(2, 0);
- B_PUTC('\a');
- break;
- }
- if (nest)
- return 0;
- break;
- }
- if (selectedFlag && isTypeLine(lhp[curLine]))
- p_mark(curLine - lp);
- continue;
- }
-
-
- /*
- 各種キー操作
- */
- if (!bl && !br) {
- if (keyEvent(&x, &y, shiftKeys) < 0)
- return lp + 1; // 登録キー
- } else
- etTab = 0;
- if (y >= 1*16 && y < 31*16 && !bl && !br)
- obl = obr = 0;
-
-
- /*
- ! 左端にカーソルがあっても復帰出来るようにする
- ! ESCでも同じです。(仮想マウスの方で対処している)
- */
- if ((bl) && (br)) { /* 両方のボタンクリック */
- if (nest)
- return 0;
- do {
- dmsstat(&dmx, &dmy, &bl, &br);
- } while (bl && br); /* どちらかのボタンが離されるのを待つ */
- continue;
- }
-
-
- if (y < 1*16) {
- /*
- ! 上メニューバー
- */
- p_fpt(3);
- if (!obl && !obr)
- On_Menubar1(x);
- } else if (y >= 31*16) {
- /*
- ! 下メニューバー
- */
- p_fpt(4);
- if (etMenu <= ontime || (!obl && !obr)) {
- if (GMODE) {
- if (bl && nest && x >= 59 * 8 && x < 63 * 8) {
- return 0;
- } else {
- On_Menubar2(x);
- }
- } else {
- if (bl && nest && x >= 90 * 8 && x < 94 * 8) {
- return 0;
- } else {
- On_Menubar2(x);
- }
- }
- }
- } else {
- /*
- ! メインスクリーン上
- */
- On_Main_Screen(x, y);
- }
- }
- }
-
-
- /*
- キーイベント
- */
- static int
- keyEvent(int *xp, int *yp, ushort shiftKeys)
- {
- int i, x, y;
- uchar bitKeys[14];
-
- x = *xp;
- y = *yp;
- for (i = 0; i < sizeof(bitKeys); i++)
- bitKeys[i] = BITSNS(i);
-
- /*
- TAB/XF3/XF4 による '◎' の検索
- */
- if (bitKeys[2] == (1<<0)) { // TAB
- if (etTab <= ontime) {
- if (debugMode && (shiftKeys & LED_ZENKAKU))
- shiftKeys ^= SHIFT_KEY;
- backwardFlag = (shiftKeys & SHIFT_KEY);
- locateTypeLine(x, y);
- }
- return 0;
- } else if (bitKeys[10] == (1<<7)) { // XF3
- if (etTab <= ontime) {
- backwardFlag = (shiftKeys & SHIFT_KEY);
- locateTypeLine(x, y);
- }
- return 0;
- } else if (bitKeys[11] == (1<<0)) { // XF4
- if (etTab <= ontime) {
- backwardFlag = !(shiftKeys & SHIFT_KEY);
- locateTypeLine(x, y);
- }
- return 0;
- }
- etTab = 0;
-
- /*
- ! CTRLキーで一番近い◎に移動する
- */
- if (shiftKeys & CTRL_KEY) {
- Ctrl_Down(x, y);
- while (ctrl_on())
- ;
- return 0;
- }
-
- /*
- CLR/DEL によるグラフィック画面/テキスト画面 ON/OFF
- */
- if (GMODE) {
- if (bitKeys[7] == (1<<7)) { // CLR
- g_pop();
- return 0;
- }
- if (bitKeys[6] == (1<<7)) { // DEL
- if (g_disp() == TRUE)
- g_off();
- else
- g_on();
- while (del_on())
- ;
- return 0;
- }
- }
-
- /*
- HELP によるオンラインマニュアル起動
- OPT.2+HELP によるデバッグモード ON/OFF
- */
- if (bitKeys[10] == (1<<4)) { // HELP
- if (shiftKeys & OPT2_KEY) // OPT.1+HELP
- inOutDebugMode();
- else
- onlinemanual();
- while (help_on())
- ;
- return 0;
- }
-
- /*
- 'P'('V') 'S' 'C' 各キーによる音楽演奏制御
- */
- if (bitKeys[3] == (1<<2) // 'P'
- || bitKeys[5] == (1<<5)) { // 'V'
- dm_play('PLAY');
- while (BITSNS(3) || BITSNS(5))
- ;
- return 0;
- } if (bitKeys[5] == (1<<6)) { // 'B'
- dm_play('STOP');
- while (BITSNS(5))
- ;
- return 0;
- } if (bitKeys[5] == (1<<4)) { // 'C'
- dm_play('CONT');
- while (BITSNS(5))
- ;
- return 0;
- }
-
- /*
- デバッグモードにおける登録キーによるエディタの呼び出し
- */
- if (debugMode && bitKeys[10] == (1<<3)) { // 登録キー
- lp1st = lp;
- return -1;
- }
-
- /*
- ! ファンクションキー呼び出し
- */
- Fkey_Down_Check(xp, yp, bitKeys);
-
- return 0;
- }
-
-
- /*
- メニューバー上の時のイベント
- */
- static void
- On_Menubar1(int mx)
- {
- mx /= 8;
-
- if (GMODE) { /* ** 64桁 G-mode ** */
- if (bl) {
- if (1 <= mx && mx < 5) { /* グラフィック画面表示 */
- if (g_disp()== TRUE) {
- g_pop();
- } else {
- g_on();
- }
- } else if (7 <= mx && mx < 47) { /* ファイル名 */
- p_file();
- } else if (51 <= mx && mx < 56) { /* child */
- callDexec("", DEX_PSCR | DEX_FKON | DEX_RETM | DEX_SHELL);
- p_fukki();
- } else if (59 <= mx && mx < 62) { /* 終了 */
- setenv_and_export("DSHELLSTAT", "");
- dend();
- }
- } else if (br) {
- if (1 <= mx && mx < 5) { /* グラフィック画面表示 */
- if (g_disp()== TRUE) {
- g_off();
- } else {
- g_on();
- }
- } else if (7 <= mx && mx < 47) { /* version */
- p_ver();
- }
- }
- } else { /* ** 96桁 ** */
- if (bl) {
- if (2 <= mx && mx < 22) { /* 起動してからの時間表示 */
- p_otm();
- } else if (28 <= mx && mx < 68) { /* ファイル名 */
- p_file();
- } else if (81 <= mx && mx < 86) { /* Child */
- callDexec("", DEX_PSCR | DEX_FKON | DEX_RETM | DEX_SHELL);
- p_fukki();
- } else if (90 <= mx && mx < 94) { /* 終了 */
- setenv_and_export("DSHELLSTAT", "");
- dend();
- }
- } else if (br) {
- if (2 <= mx && mx < 22) { /* フリーエリアのサイズ表示 */
- p_freearea();
- } else if (28 <= mx && mx < 68) { /* version */
- p_ver();
- }
- }
- }
- }
-
- /*
- メニューバー下のイベント
- */
- static void
- On_Menubar2(int mx)
- {
- int a;
-
- etMenu = init_et(40);
- mx /= 8; /* バイトキャラクタレベルで判定 */
-
- /*
- ! レフトダウン
- */
- if (bl) {
- if (mx >= 2 && mx < 6) { /* 先頭行 */
- selectedFlag = FALSE;
- curLine = exeLine = -1;
- if (lp) {
- lp = 0;
- p_scr();
- p_fpt(0);
- } else
- p_norev();
- adjMspos();
- } else if (mx >= 9 && mx < 13) { /* 次の頁 */
- if (lp < lpmx - 30) {
- lp += scrlin;
- if (lp > lpmx - 30) {
- lp = lpmx - 30;
- }
- p_scr();
- p_fpt(0);
- }
- adjMspos();
- if (obl && !obr)
- etMenu = init_et(20);
- } else if (mx >= 16 && mx < 20) { /* 次の区 */
- for (a = lp + 1; a < lpmx; a++) {
- if (lhp[a][0] == CTRL_CHAR && lhp[a][1] == HR_CHAR)
- break;
- }
- if (a >= lpmx) {
- if (lp >= lpmx - 30)
- return;
- a = lpmx - 30;
- }
- lp = a;
- p_scr();
- p_fpt(0);
- adjMspos();
- if (obl && !obr)
- etMenu = init_et(20);
- } else if (mx >= 23 && mx < 27) { /* 次行 */
- line_f();
- if (obl && !obr)
- etMenu = 0;
- }
- if (GMODE == 0) {
- if (mx >= 30 && mx < 33) { /* RGBメニュー */
- Menu_rgb();
- p_fukki();
- } else if (mx >= 35 && mx < 39) { /* MESHメニュー */
- Menu_mesh();
- p_fukki();
- } else if (mx >= 41 && mx < 45) { /* FINDメニュー */
- Menu_find();
- p_fukki();
- } else if (mx >= 47 && mx < 51) { /* FILEメニュー */
- Menu_file();
- p_fukki();
- }
- } else {
- if (mx == 64) { /* FINDメニュー */
- Menu_find();
- p_fukki();
- } else if (mx == 65) { /* FILEメニュー */
- Menu_file();
- p_fukki();
- }
- }
- if ((GMODE && mx >= 49 && mx < 53) || (!GMODE && mx >= 53 && mx < 57)) { /* 印刷メニュー */
- prn_menu(GMODE ? 49 : 53);
- p_fukki();
- } else if ((GMODE && mx >= 54 && mx < 58) || (!(GMODE) && mx >= 59 && mx < 63)) {
- menu(GMODE ? 54 : 59);
- p_fukki();
- }
- if (!(GMODE)) {
- if (mx >= 66 && mx < 80) { /* リアルタイムスクロール */
- if (lpmx > 30) {
- Realtime_Scroll();
- }
- }
- }
- }
- /*
- ! ライトダウン
- */
- else if (br) {
- if (mx >= 2 && mx < 6) { /* 最終行 */
- selectedFlag = FALSE;
- curLine = exeLine = lpmx;
- if (lp < lpmx - 30) {
- lp = (lpmx - 30 < 0) ? 0 : lpmx - 30;
- p_scr();
- p_fpt(0);
- } else
- p_norev();
- adjMspos();
- } else if (mx >= 9 && mx < 13) { /* 前の頁 */
- if (lp) {
- lp -= scrlin;
- if (lp < 0) {
- lp = 0;
- }
- p_scr();
- p_fpt(0);
- }
- adjMspos();
- if (obr & !obl)
- etMenu = init_et(20);
- } else if (mx >= 16 && mx < 20) { /* 前の区 */
- if (lp > 0) {
- for (a = lp - 1; a > 0; a--) {
- if (lhp[a][0] == CTRL_CHAR && lhp[a][1] == HR_CHAR)
- break;
- }
- lp = a;
- p_scr();
- p_fpt(0);
- }
- adjMspos();
- if (obr && !obl)
- etMenu = init_et(20);
- } else if (mx >= 23 && mx < 27) { /* 前行 */
- line_b();
- if (obr && !obl)
- etMenu = 0;
- } else if ((GMODE && mx >= 54 && mx < 58) || (!(GMODE) && mx >= 59 && mx < 63)) {
- localMenu(GMODE ? 54 : 59);
- p_fukki();
- }
- }
- }
-
- /*
- メインスクリーン上でのイベント
- */
- static void
- On_Main_Screen(int mx, int my)
- {
- p_fpt(0); /* リアルタイム行数表示(マウスカーソル位置) */
-
- /*
- ! レフトボタン
- */
- if (bl) {
- if (mx < 16) {
- dmsstat(&dmx, &dmy, &bl, &br);
- if (bl || (msbtn(0, 0, 0) && msbtn(1, 0, 60) > 0)) {
- callDtype(lp + my / 16 - 1);
- }
- } else {
- line_f();
- }
- }
- /*
- ! ライトボタン
- */
- if (br) {
- if (mx >= 16) {
- line_b();
- }
- }
- }
-
- /*
- ファンクションキーの読みだしルーチン
- 強引にマウスの座標を変える(カーソルの位置は変わらない)
- */
- static void
- Fkey_Down_Check(int *xp, int *yp, uchar bitKeys[])
- {
- #define TX(x) ((x)*8)
- #define M_BAR1 0
- #define M_BAR2 496
- int x = *xp;
- int y = *yp;
-
- switch (bitKeys[0x0c]) {
- case 0x08:
- x = TX(4);
- y = M_BAR2;
- bl = -1;
- break; /* F.1:ScrUp */
- case 0x10:
- x = TX(4);
- y = M_BAR2;
- br = -1;
- break; /* F.2:ScrDown */
- case 0x20:
- x = TX(11);
- y = M_BAR2;
- bl = -1;
- break; /* F.3:NextPage */
- case 0x40:
- x = TX(11);
- y = M_BAR2;
- br = -1;
- break; /* F.4:PrevPage */
- case 0x80:
- x = TX(18);
- y = M_BAR2;
- bl = -1;
- break; /* F.5:NextArea */
- default:
- break;
- }
- if (GMODE) {
- switch (bitKeys[0x0d]) {
- case 0x01:
- x = TX(18);
- y = M_BAR2;
- br = -1;
- break; /* F.6:PrevArea */
- case 0x02:
- x = TX(25);
- y = M_BAR2;
- bl = -1;
- break; /* F.7:NextLin */
- case 0x04:
- x = TX(25);
- y = M_BAR2;
- br = -1;
- break; /* F.8:PrevLin */
- case 0x08:
- x = TX(52);
- y = M_BAR1;
- bl = -1;
- break; /* F.9:ChildProc */
- case 0x10:
- x = TX(61);
- y = M_BAR1;
- bl = -1;
- break; /* F.10:Exit */
- default:
- if (bitKeys[3] == (1<<7)) { // S:FIND
- x = TX(64);
- y = M_BAR2;
- bl = -1;
- } else if (bitKeys[4] == (1<<1)) { // F:LOAD
- x = TX(65);
- y = M_BAR2;
- bl = -1;
- }
- break;
- }
- } else {
- switch (bitKeys[0x0d]) {
- case 0x01:
- x = TX(18);
- y = M_BAR2;
- br = -1;
- break; /* F.6:PrevArea */
- case 0x02:
- x = TX(25);
- y = M_BAR2;
- bl = -1;
- break; /* F.7:NextLin */
- case 0x04:
- x = TX(25);
- y = M_BAR2;
- br = -1;
- break; /* F.8:PrevLin */
- case 0x08:
- x = TX(83);
- y = M_BAR1;
- bl = -1;
- break; /* F.9:ChildProc */
- case 0x10:
- x = TX(92);
- y = M_BAR1;
- bl = -1;
- break; /* F.10:Exit */
- default:
- if (bitKeys[3] == (1<<7)) { // S:FIND
- x = TX(41);
- y = M_BAR2;
- bl = -1;
- } else if (bitKeys[4] == (1<<1)) { // F:LOAD
- x = TX(47);
- y = M_BAR2;
- bl = -1;
- }
- break;
- }
- }
-
- *xp = x;
- *yp = y;
- }
-
- /*
- 一番近い「◎」にカーソルを移動する
- */
- static void
- Ctrl_Down(int mx, int my)
- {
- int i;
-
- my = my / 16 - 1;
- if (my < 0)
- my = 0;
- else if (my > 29)
- my = 29;
- if (my + lp > lpmx)
- my = lpmx - lp;
-
- for (i = 0;; i++) {
- if (my + i < 30 && my + i + lp < lpmx) { /* 下に向かって探す */
- if (isTypeLine(lhp[lp + my + i])) {
- i = my + i;
- goto SELECT;
- }
- }
- if ((my - i) >= 0 && lp + my - i < lpmx) { /* 上に向かって探す */
- if (isTypeLine(lhp[lp + my - i])) {
- i = my - i;
- goto SELECT;
- }
- }
- if ((my - i) < 0 && ((my + i >= 30) || (lp + i + my >= lpmx))) { /* ◎がなかった */
- break;
- }
- }
- return;
-
- SELECT:
- curLine = lp + i;
- exeLine = -1;
- selectedFlag = TRUE;
- setmspos(8, (i + 1) * 16 + 8);
- p_mark(i);
- }
-
-
- /*
- 後方スクロール
- */
- static void
- line_b(void)
- {
- if (lp > 0) {
- lp--;
- #if SSCRL
- TXRASCPY(119 * 256 + 120, 116, 0x8003);
- w_hs();
- TXRASCPY(120 * 256 + 121, 116, 0x8003);
- w_hs();
- TXRASCPY(121 * 256 + 122, 116, 0x8003);
- w_hs();
- TXRASCPY(122 * 256 + 123, 116, 0x8003);
- w_hs();
- p_lin(lp, 0);
- #else
- if (!shift_on()) {
- #define D 56
- p_lin(lp, 62);
- TXRASCPY((120 - D) * 256 + 128, D, 3);
- vsync();
- TXRASCPY((120 - 1 - D) * 256 + (124 - 1 - D), 116 - D, 0x8003);
- TXRASCPY((256 - 4) * 256 + 4, 4, 3);
- TXRASCPY(128 * 256 + (124 - D), D, 3);
- #undef D
- } else {
- TXRASCPY((120 - 1) * 256 + (124 - 1), 116, 0x8003);
- p_lin(lp, 0);
- }
- #endif
- }
- }
-
- /*
- 前方スクロール
- */
- static void
- line_f(void)
- {
- if (lp < lpmx - 30) {
- lp++;
- #if SSCRL
- TXRASCPY(8 * 256 + 7, 116, 3);
- w_hs();
- TXRASCPY(7 * 256 + 6, 116, 3);
- w_hs();
- TXRASCPY(6 * 256 + 5, 116, 3);
- w_hs();
- TXRASCPY(5 * 256 + 4, 116, 3);
- w_hs();
- #else
- if (!shift_on())
- vsync();
- TXRASCPY(8 * 256 + 4, 116, 3);
- #endif
- p_lin(lp + 29, 29);
- }
- }
-
- #if SSCRL
- int
- w_hs()
- {
- char *gpip = 0xe88001;
-
- while ((B_BPEEK(gpip) & 0x80) == 0)
- ;
- while (B_BPEEK(gpip) & 0x80)
- ;
-
- return 0;
- }
- #endif
-
-
-
- /*
- ROM の電卓ルーチンバグ(D3破壊)対策
- キー入力がある間捨てる(キースキャンする)
- */
- void
- check_keysns(void)
- {
- asm("\
- movem.l d3,-(sp) \n\
- 0: moveq #1,d0 * 1:B_KEYSNS \n\
- trap #15 \n\
- tst.l d0 \n\
- beq 1f \n\
- moveq #0,d0 * 0:B_KEYINP \n\
- trap #15 \n\
- bra 0b \n\
- 1: movem.l (sp)+,d3" : : : "d0");
- }
-
-
- /*
- ◎マーク非反転表示
- */
- void
- p_norev(void)
- {
- int i, lno = lp;
-
- B_COLOR(3);
- for (i = 1; i <= 30; i++) {
- if (lno >= 0 && lno < lpmx && isTypeLine(lhp[lno])) {
- B_LOCATE(0, i);
- if (debugMode && lhp[lno][1] == VEXEC_CHAR) {
- B_COLOR(2);
- B_PUTC(L'◎');
- B_COLOR(3);
- } else {
- B_PUTC(L'◎');
- }
- }
- lno++;
- }
- }
-
-
- /*
- ◎マーク反転表示
- */
- static int revY; // 反転表示した行
- void
- p_rev(int lin)
- {
- p_norev();
- B_PUTMES(9, 0, revY = lin + 1, 2 - 1, "◎");
- }
-
-
- /*
- 反転表示された '◎' を任意の文字に変える
- */
- void
- p_execmark(ushort c)
- {
- B_COLOR(1);
- B_LOCATE(0, revY);
- B_PUTC(c);
- B_COLOR(3);
- }
-
- /*
- 選択された '◎' の色を変えて表示する
- */
- static void
- p_mark(int lin)
- {
- p_norev();
- B_PUTMES(1, 0, lin + 1, 2 - 1, "◎");
- }
-
-
- /*
- 1キー閲覧 (oneKeyView()) とその下請け関数
-
- スペースを押すたびに
-
- ◎の選択、実行
- 頁内に◎がもうなかったら次頁
- EOFに達したら復帰
-
- 相当の処理を順に進める
- */
- static uchar
- checkBreakPoint(const char *p)
- {
- if (debugMode && *p++ == '\x1b' && *p++ == '[' && *p == 'm'
- && (B_SFTSNS() & (LED_CODEIN | LED_KANA)) == LED_CODEIN) {
- LEDMOD(2, 0);
- w_open();
- w_mes(1, "*BREAK POINT*");
- w_wait(99);
- w_close();
- return selectedFlag = TRUE;
- }
- return FALSE;
- }
-
- static int
- oneKeyLocateF(int y, uchar scrollFlag)
- {
- int n, m, lpBak = lp;
-
- n = curLine;
- if (y == exeLine)
- n = y + 1;
- else if (y >= 0 && y < lpmx)
- n = y;
- if (n >= lpmx && lp >= lpmx - 30)
- goto RETURN_RETN;
- else if (n < lp || n >= lp + 30)
- n = lp;
- m = lp + 29;
- if (m >= lpmx)
- m = lpmx - 1;
- for (; n <= m; n++) {
- if (isTypeLine(lhp[n]) || checkBreakPoint(lhp[n])) {
- selectedFlag = TRUE;
- break;
- }
- }
- curLine = n;
- m = n - lp;
- if (!selectedFlag && n >= lpmx && lp >= lpmx - 30)
- goto RETURN_RETN;
- if (m >= 23) {
- if (scrollFlag) {
- while (m > 10 && lp < lpmx - 30) {
- lp++;
- TXRASCPY(8 * 256 + 4, 116, 3);
- p_lin(lp + 29, 29);
- m--;
- }
- p_fpt(0);
- } else if (lp < lpmx - 30) {
- curLine--;
- }
- }
- if (selectedFlag)
- setmspos(8, (m + 1) * 16 + 8);
- else {
- if (m > 0)
- m--;
- if (lpBak >= lpmx - 30) {
- curLine = lpmx;
- m = 29;
- }
- locateEol(m + 1);
- }
- return ONEKEY_CONT;
-
- RETURN_RETN:
- p_norev();
- selectedFlag = FALSE;
- exeLine = curLine = lpmx;
- locateEol(30);
-
- return ONEKEY_RETN;
- }
-
- static int
- oneKeyLocateB(int y, uchar scrollFlag)
- {
- int n, m, lpBak = lp;
-
- n = curLine;
- if (y == exeLine)
- n = y - 1;
- else if (y >= 0 && y < lpmx)
- n = y;
- if (n < 0 && lp == 0)
- goto RETURN_RETN;
- else if (n < lp || n >= lp + 30)
- n = lp + 29;
- if (n >= lpmx)
- n = lpmx - 1;
- m = lp;
- for (; n >= m; n--) {
- if (isTypeLine(lhp[n]) || checkBreakPoint(lhp[n])) {
- selectedFlag = TRUE;
- break;
- }
- }
- curLine = n;
- m = n - lp;
- if (!selectedFlag && n < 0 && lp <= 0)
- goto RETURN_RETN;
- if (m <= 6) {
- if (scrollFlag) {
- while (m < 19 && lp > 0) {
- lp--;
- TXRASCPY((116 + 3) * 256 + (120 + 3), 116, 0x8003);
- p_lin(lp, 0);
- m++;
- }
- p_fpt(0);
- } else if (lp > 0) {
- curLine++;
- }
- }
- if (selectedFlag)
- setmspos(8, (m + 1) * 16 + 8);
- else {
- if (m < 29)
- m++;
- if (lpBak <= 0) {
- curLine = -1;
- m = 0;
- }
- locateEol(m + 1);
- }
- return ONEKEY_CONT;
-
- RETURN_RETN:
- p_norev();
- selectedFlag = FALSE;
- exeLine = curLine = -1;
- locateEol(1);
-
- return ONEKEY_RETN;
- }
-
- static int
- oneKeyView(int x, int y, uchar scrollFlag)
- {
- int stat;
-
- y = y / 16 - 1;
- if (x < 16 && y >= 0 && y < 30) {
- y += lp;
- if (selectedFlag && y == curLine) {
- while (space_on())
- ;
- exeLine = curLine;
- return ONEKEY_EXEC;
- }
- if (B_SFTSNS() & LED_CODEIN)
- y = curLine;
- } else
- y = -1;
- selectedFlag = FALSE;
- if (backwardFlag)
- stat = oneKeyLocateB(y, scrollFlag);
- else
- stat = oneKeyLocateF(y, scrollFlag);
-
- while (space_on())
- ;
-
- return stat;
- }
-
-
- /*
- スペースキーのチェック
- (デバッグモードではコード入力キーの LED も同じ扱い)
- */
- static int
- checkOneKeyView(void)
- {
- if (codein_on()) {
- if (debugMode)
- return TRUE;
- LEDMOD(2, 0);
- }
- return space_on();
- }
-
-
- /*
- '◎' の検索
- */
- static void
- locateTypeLine(int x, int y)
- {
- short stat;
-
- etTab = init_et((etTab == 0) ? 40 : 10);
- if ((stat = oneKeyView(x, y, TRUE)) == ONEKEY_EXEC) {
- selectedFlag = FALSE;
- mspos(&x, &y);
- stat = oneKeyView(x, y, TRUE);
- }
- if (selectedFlag) {
- etTab = init_et(20);
- if (isTypeLine(lhp[curLine]))
- p_mark(curLine - lp);
- else
- p_norev();
- } else if (stat == ONEKEY_RETN)
- etTab = init_et(40);
- }
-
-
- /*
- 行頭が '◎' (の内部コード) かどうか調べる
- */
- static int
- isTypeLine(const uchar *s)
- {
- return (s[0] == CTRL_CHAR && (s[1] | 0x20) == VEXEC_CHAR);
- }
-
-
- /*
- 'TYPE=' (の内部コード) を探し、直後の文字位置を返す
- */
- static uchar *
- searchType(const uchar *s)
- {
- int n;
-
- while (n = dinstrchr(s, CTRL_CHAR)) {
- s += n;
- if (*s == TYPE_CHAR || *s == NULTYPE_CHAR)
- return s + 1;
- }
- return NULL;
- }
-
-
- /*
- '◎' の実行確認 (◎^[[m~TYPE=~)
- */
- static int
- exeQuery(void)
- {
- int x, y, bl, br;
-
- if (!debugMode || !strnEqu(lhp[exeLine] + 2, "\x1b[m", 3) || !codein_on())
- return TRUE;
-
- w_open();
- w_mes(0, "実行しますか?");
- w_mes(2, "左クリックで実行/右クリックでスキップ");
- wait_mb_off();
- do {
- dmsstat(&x, &y, &bl, &br);
- } while (!bl && !br && codein_on());
- w_close();
- wait_mb_off();
-
- return (bl && !br);
- }
-
-
- /*
- dtype() を呼ぶ
- */
- static void
- callDtype(int lno)
- {
- uchar *p;
-
- exeLine = curLine = lno;
- selectedFlag = FALSE;
- if (lno < lpmx && isTypeLine(lhp[lno])) {
- if ((p = searchType(lhp[lno])) != NULL
- || ++lno < lpmx && !isTypeLine(lhp[lno]) && (p = searchType(lhp[lno])) != NULL) {
- p_rev(curLine - lp);
- if (exeQuery()) {
- dtype(p, FALSE);
- if (debugMode && lhp[curLine][1] == EXEC_CHAR)
- lhp[curLine][1] = VEXEC_CHAR;
- }
- p_fukki();
- p_rev(curLine - lp);
- mouse(1);
- wait_mb_off();
- }
- }
- }
-
-
- /*
- dexec() を呼ぶ
- */
- static void
- callDexec(const char *command, int flag)
- {
- dexec(command, flag);
- mouse(1);
- selectedFlag = FALSE;
- }
-
-
- /*
- マウスカーソルがメインスクリーンの (x, 0)~(x, 15) にあったら
- ちょっとずらす
- */
- static void
- adjMspos(void)
- {
- int mx, my;
-
- mspos(&mx, &my);
- if (mx < 16 && my >= 1*16 && my < 31*16)
- setmspos(16, my);
- }
-
-
- /*
- 指定行の (表示上の) 行末にマウスカーソルを位置付ける
- */
- asm("
- _locateEol::
- suba.l a1,a1
- moveq.l #$81,d0 *B_SUPER
- trap #15
- move.l d0,-(sp)
-
- moveq.l #7+4,d0
- move.l 4+4(sp),d2
- lsl.l d0,d2
- add.l #$e00000,d2
- movea.l d2,a0
- moveq.l #96-1-1,d1
- tst.w _GMODE
- beq @f
- moveq.l #64-1-1,d1
- @@: lea.l 1(a0,d1.l),a0
- movea.l a0,a1
- adda.l #1024*128,a1
- lea.l $e8002a,a2 *CRTC R21
- move.w (a2),d0 *{
- move.w #0,(a2)
-
- @@: move.b -(a0),d2
- or.b $0080(a0),d2
- or.b $0100(a0),d2
- or.b $0180(a0),d2
- or.b $0200(a0),d2
- or.b $0280(a0),d2
- or.b $0300(a0),d2
- or.b $0380(a0),d2
- or.b $0400(a0),d2
- or.b $0480(a0),d2
- or.b $0500(a0),d2
- or.b $0580(a0),d2
- or.b $0600(a0),d2
- or.b $0680(a0),d2
- or.b $0700(a0),d2
- or.b $0780(a0),d2
- or.b -(a1),d2
- or.b $0080(a1),d2
- or.b $0100(a1),d2
- or.b $0180(a1),d2
- or.b $0200(a1),d2
- or.b $0280(a1),d2
- or.b $0300(a1),d2
- or.b $0380(a1),d2
- or.b $0400(a1),d2
- or.b $0480(a1),d2
- or.b $0500(a1),d2
- or.b $0580(a1),d2
- or.b $0600(a1),d2
- or.b $0680(a1),d2
- or.b $0700(a1),d2
- or.b $0780(a1),d2
- dbne d1,@b
-
- move.w d0,(a2) *}
- addq.w #1,d1
- cmpi.w #2,d1
- bcc @f
- moveq.l #2,d1
- @@: lsl.w #3,d1
- addq.w #4,d1
- swap.w d1
- move.w 4+2+4(sp),d1
- lsl.w #4,d1
- moveq.l #$76,d0 *MS_CURST
- trap #15
-
- .if 0
- move.l (sp)+,d0
- bmi @f
- movea.l d0,a1
- .else
- movea.l (sp)+,a1
- .endif
- moveq.l #$81,d0 *B_SUPER
- trap #15
- @@: rts
- ");
-
-
- /*
- デバッグモードの ON/OFF (OPT.2+HELP)
- */
- static void
- inOutDebugMode(void)
- {
- char temp[64];
-
- debugMode = !debugMode;
- w_open();
- sprintf(temp, "デバッグモード%sます", (debugMode) ? "に入り" : "を抜け");
- w_mes(1, temp);
- w_wait(60);
- p_scr();
- }
-
- /*
- デバッグモード+コード入力+ローマ字orかな 時の“端折り”チェック
- */
- static int checkRapidExec(void)
- {
- int n;
- ushort shiftKeys;
-
- if (!debugMode)
- return FALSE;
- shiftKeys = B_SFTSNS();
- if (!(shiftKeys & LED_CODEIN) || !(shiftKeys & (LED_ROMA | LED_KANA)))
- return FALSE;
- for (n = 0; n < lpmx; n++)
- if (isTypeLine(lhp[n]))
- return FALSE;
- return TRUE;
- }
-